/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package ejb;

import com.google.gdata.client.calendar.CalendarService;
import com.google.gdata.data.DateTime;
import com.google.gdata.data.PlainTextConstruct;
import com.google.gdata.data.calendar.CalendarEventEntry;
import com.google.gdata.data.calendar.CalendarEventFeed;
import com.google.gdata.data.extensions.When;
import com.google.gdata.util.AuthenticationException;
import com.google.gdata.util.ServiceException;
import entity.AnagraficaUtente;
import entity.AnagraficaUtenteFacadeLocal;
import entity.Campo;
import entity.CampoFacadeLocal;
import entity.Evento;
import entity.EventoFacadeLocal;
import entity.News;
import entity.NewsFacadeLocal;
import entity.PostiOccupati;
import entity.PostiOccupatiFacadeLocal;
import entity.Posto;
import entity.PostoFacadeLocal;
import entity.PrenotazioneCampo;
import entity.PrenotazioneCampoFacadeLocal;
import entity.PrenotazioneEvento;
import entity.PrenotazioneEventoFacadeLocal;
import entity.Utente;
import entity.UtenteFacadeLocal;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.ws.WebServiceRef;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import webserviceclient.MandaMail;
import webserviceclient.MandaMailResponse;
import webserviceclient.MyDispatcherService;

/**
 *
 * @author Marco
 */
@Stateless
public class BusinessLogic implements BusinessLogicLocal {

    @WebServiceRef(wsdlLocation = "META-INF/wsdl/localhost_8008/index.wsdl")
    private MyDispatcherService service;

    @PersistenceContext(unitName = "CentroSportivo-ejbPU")
    private EntityManager em;
    @EJB
    private UtenteFacadeLocal utenteFacade;
    @EJB
    private AnagraficaUtenteFacadeLocal anagraficaUtenteFacade;
    @EJB
    private EventoFacadeLocal eventoFacade;
    @EJB
    private PostoFacadeLocal postoFacade;
    @EJB
    private PrenotazioneEventoFacadeLocal prenotazioneEventoFacade;
    @EJB
    private PostiOccupatiFacadeLocal postiOccupatiFacade;
    @EJB
    private CampoFacadeLocal campoFacade;
    @EJB
    private PrenotazioneCampoFacadeLocal prenotazioneCampoFacade;
    @EJB
    private NewsFacadeLocal newsFacade;

    // Add business logic below. (Right-click in editor and choose
    // "Insert Code > Add Business Method")
    @Override
    public List<Utente> checkLogin(String nomeUtente, String password) {
        Query checkLoginParameters = em.createNamedQuery("Utente.findUser");
        checkLoginParameters.setParameter("nomeUtente", nomeUtente);
        checkLoginParameters.setParameter("password", password);
        List result = checkLoginParameters.getResultList();
        return result;
    }

    @Override
    public String insertUtente(String codiceFiscale, String nome, String cognome, char sesso, String dataNascita, String luogoNascita, String indirizzoResidenza, String email, String password, String telefono) {
        if (validateRegistration(email)) {
            AnagraficaUtente utente = new AnagraficaUtente();
            Utente credenzialiUtente = new Utente();
            utente.setCodiceFiscale(codiceFiscale.toUpperCase());
            utente.setNome(nome.toUpperCase());
            utente.setCognome(cognome.toUpperCase());
            utente.setSesso(sesso);
            String[] data = dataNascita.split("-");
            Date d = Date.valueOf(data[2] + "-" + data[1] + "-" + data[0]);
            utente.setDataNascita(d);
            utente.setLuogoNascita(luogoNascita.toUpperCase());
            utente.setIndirizzoResidenza(indirizzoResidenza.toUpperCase());
            utente.setEmail(email);
            utente.setTelefono(telefono);
            credenzialiUtente.setNomeUtente(email);
            credenzialiUtente.setPassword(password);
            credenzialiUtente.setFlag(-1);
            try {
                utenteFacade.create(credenzialiUtente);
                anagraficaUtenteFacade.create(utente);
            } catch (Exception e) {
                System.out.println(e.toString());
                return "ErroreDB";
            }
            String messaggio = "Buongiorno " + email + ",<br>la sua registrazione al sito mfn-centrosportivo ha avuto successo.<br>Per verificare l'utente seguire il seguente link: <a href=\"http://localhost:8080/mfm-centro-sportivo-war/verificautente.jsp?submit=convalida&nick=" + email + "&p=" + password + "\">http://localhost:8080/mfm-centro-sportivo-war/verificautente.jsp?submit=convalida&nick=" + email + "&p=" + password + "</a><br><br>Cordiali Saluti,<br>mfn-centrosportivo";
            sendMail(email, "Registrazione a mfn-centrosportivo", messaggio, " ", " ");
            return "InserimentoEffettuato";
        } else {
            return "ErroreUtente";
        }
    }

    public void persist(Object object) {
        em.persist(object);
    }

    @Override
    public boolean validateRegistration(String nomeUtente) {
        Query alredyRegistered = em.createNamedQuery("Utente.findUserName");
        alredyRegistered.setParameter("nomeUtente", nomeUtente);
        List<String> result = alredyRegistered.getResultList();
        return result.isEmpty();
    }

    @Override
    public boolean changePwd(String nomeUtente, String password) {
        Query changepwd = em.createQuery("UPDATE Utente u SET u.password='" + password + "' WHERE u.nomeUtente='" + nomeUtente + "'");
        int result = changepwd.executeUpdate();
        //em.getTransaction().commit();
        if (result == 0) {
            return false;
        }
        return true;
    }

    @Override
    public List<AnagraficaUtente> getProfiloUtente(String utente) {
        Query profiloUtente = em.createNamedQuery("AnagraficaUtente.findDati");
        profiloUtente.setParameter("email", utente);
        List<AnagraficaUtente> result = profiloUtente.getResultList();
        return result;
    }

    @Override
    public String insertEvento(String titoloEvento, String descrizioneEvento, String dataEvento, String orari, float prezzoParterre, float prezzoArancio, float prezzoBlu, float prezzoRosso, float prezzoVerde, float prezzoGiallo, String locandina) {
        //controllo la data per inserire evento
        Evento evento = new Evento();
        if (validateEvent(dataEvento, orari)) {
            //insertEventoCalendar(titoloEvento, descrizioneEvento, dataEvento, orari);
            evento.setTitoloEvento(titoloEvento);
            evento.setDescrizioneEvento(descrizioneEvento);
            String[] data = dataEvento.split("/");
            System.out.println("DATA: " + "20" + data[2] + "-" + data[1] + "-" + data[0]);
            Date d = Date.valueOf("20" + data[2] + "-" + data[1] + "-" + data[0]);
            evento.setDataEvento(d);
            evento.setOrari(orari);
            evento.setPrezzoParterre(prezzoParterre);
            evento.setPrezzoArancio(prezzoArancio);
            evento.setPrezzoBlu(prezzoBlu);
            evento.setPrezzoGiallo(prezzoGiallo);
            evento.setPrezzoRosso(prezzoRosso);
            evento.setPrezzoVerde(prezzoVerde);
            evento.setLocandina(locandina);
            try {
                eventoFacade.create(evento);
                //System.out.println("CREATEEEEEEEE");
            } catch (Exception e) {
                //System.out.println(e.toString());
                return "ErroreDB";
            }
            Calendar cal = new GregorianCalendar();
            int giorno = cal.get(Calendar.DAY_OF_MONTH);
            int mese = cal.get(Calendar.MONTH);
            int anno = cal.get(Calendar.YEAR);
            Date datan = Date.valueOf(anno + "-" + mese + "-" + giorno);
            this.insertNews("NUOVO EVENTO: " + titoloEvento, descrizioneEvento, datan);
            return "InserimentoEffettuato";
        } else {
            System.out.println("sovrapp evento");
            return "SovrapposizioneEvento";
        }
    }

    //inserisce evento nel calendario
    private boolean insertEventoCalendar(String titoloEvento, String descrizioneEvento, String dataEvento, String orari) {
        try {
            CalendarService myService = new CalendarService("SSCSWEB-calendar");
            myService.setUserCredentials("centrosportivosscsweb@gmail.com", "sscsweb1314");
            URL postURL = new URL("http://www.google.com/calendar/feeds/rclofv5cklojdet691othjrsg4@group.calendar.google.com/private/full");
            CalendarEventEntry myEvent = new CalendarEventEntry();

            //Set the title and description
            myEvent.setTitle(new PlainTextConstruct(titoloEvento));
            myEvent.setContent(new PlainTextConstruct(descrizioneEvento));

            String[] ora = orari.split("\\.");
            int ora_fine = (Integer.decode(ora[0]) + 1) % 24;
            String[] data = dataEvento.split("/");
            //Create DateTime events and create a When object to hold them, then add
            //the When event to the event
            //System.out.println("20" + data[2] + "-" + data[1] + "-" + data[0] + "T" + ora[0] + ":" + ora[1] + ":00+02:00");

            DateTime startTime = DateTime.parseDateTime("20" + data[2] + "-" + data[1] + "-" + data[0] + "T" + ora[0] + ":" + ora[1] + ":00+02:00");
            DateTime endTime = DateTime.parseDateTime("20" + data[2] + "-" + data[1] + "-" + data[0] + "T" + ora_fine + ":" + ora[1] + ":00+02:00");
            When eventTimes = new When();
            eventTimes.setStartTime(startTime);
            eventTimes.setEndTime(endTime);
            myEvent.addTime(eventTimes);

            // POST the request and receive the response:
            CalendarEventEntry insertedEntry = myService.insert(postURL, myEvent);

            if (insertedEntry != null) {
                return true;
            }
        } catch (AuthenticationException ex) {
            Logger.getLogger(BusinessLogic.class.getName()).log(Level.SEVERE, null, ex);
        } catch (MalformedURLException ex) {
            Logger.getLogger(BusinessLogic.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(BusinessLogic.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ServiceException ex) {
            Logger.getLogger(BusinessLogic.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(BusinessLogic.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
        return false;
    }

    /*private boolean deleteEventoCalendar(String titoloEvento, String dataEvento, String orari) {
        try {
            CalendarService myService = new CalendarService("SSCSWEB-calendar");
            myService.setUserCredentials("centrosportivosscsweb@gmail.com", "sscsweb1314");
            URL calendarURL = new URL("http://www.google.com/calendar/feeds/centrosportivosscsweb@gmail.com/private/full");
            CalendarEventFeed resultFeed = myService.getFeed(calendarURL, CalendarEventFeed.class);
            String[] d = dataEvento.split("-");
            String[] ora = orari.split("\\.");
            String data = d[20] + "-" + d[1] + "-" + d[2] + "T" + ora[0] + ":" + ora[1] + ":00+02:00";

            for (int i = 0; i < resultFeed.getEntries().size(); i++) {
                CalendarEventEntry entry = resultFeed.getEntries().get(i);
                String tit = entry.getTitle().getPlainText();
                String datac = entry.getTimes().get(0).getStartTime().toString();
                if (tit.equals(titoloEvento) && datac.equals(data)) {
                    entry.delete();
                    return true;
                }
            }
        } catch (MalformedURLException ex) {
            Logger.getLogger(BusinessLogic.class.getName()).log(Level.SEVERE, null, ex);
        } catch (AuthenticationException ex) {
            Logger.getLogger(BusinessLogic.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(BusinessLogic.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ServiceException ex) {
            Logger.getLogger(BusinessLogic.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(BusinessLogic.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
        return false;
    }*/

    //cancella evento dal calendario
    private boolean deleteEventoCalendar(String titoloEvento) {
        try {
            CalendarService myService = new CalendarService("SSCSWEB-calendar");
            myService.setUserCredentials("centrosportivosscsweb@gmail.com", "sscsweb1314");
            URL calendarURL = new URL("http://www.google.com/calendar/feeds/rclofv5cklojdet691othjrsg4@group.calendar.google.com/private/full");
            CalendarEventFeed resultFeed = myService.getFeed(calendarURL, CalendarEventFeed.class);   

            for (int i = 0; i < resultFeed.getEntries().size(); i++) {
                CalendarEventEntry entry = resultFeed.getEntries().get(i);
                String tit = entry.getTitle().getPlainText();
                if (tit.equals(titoloEvento)) {
                    entry.delete();
                    return true;
                }
            }
        } catch (MalformedURLException ex) {
            Logger.getLogger(BusinessLogic.class.getName()).log(Level.SEVERE, null, ex);
        } catch (AuthenticationException ex) {
            Logger.getLogger(BusinessLogic.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(BusinessLogic.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ServiceException ex) {
            Logger.getLogger(BusinessLogic.class.getName()).log(Level.SEVERE, null, ex);
        }
        return false;
    }

    @Override
    public List<Evento> findAllEvent() {
        Query allEvent = em.createNamedQuery("Evento.findAll");
        List result = allEvent.getResultList();
        return result;
    }

    @Override
    public Evento findEventbyId(long idEvento) {
        Query event = em.createNamedQuery("Evento.findByID");
        event.setParameter("id", idEvento);
        Evento e = (Evento) event.getResultList().get(0);
        return e;
    }

    @Override
    public List<Utente> caricaUtenti() {
        Query utenti = em.createNamedQuery("Utente.findAll");
        List<Utente> result = utenti.getResultList();
        return result;
    }

    @Override
    public boolean cambiaPermessi(int flag, long id) {
        Query changeper = em.createQuery("UPDATE Utente u SET u.flag=" + flag + " WHERE u.id=" + id);
        int res = changeper.executeUpdate();
        if (res == 0) {
            return false;
        }
        return true;
    }

    @Override
    public boolean cancellaUtente(long id) {
        Query cancellaut = em.createQuery("DELETE FROM Utente u WHERE u.id=" + id);
        int res = cancellaut.executeUpdate();
        if (res == 0) {
            return false;
        }
        return true;
    }

    @Override
    public boolean cancellaEvento(long idEvento) {
        /*Query selezionaevento = em.createQuery("SELECT e FROM Evento e WHERE e.id=" + idEvento);
         Evento e = (Evento) selezionaevento.getSingleResult();
         if (e == null) {
         return false;
         }
         boolean canc = deleteEventoCalendar(e.getTitoloEvento());
         if (canc == false) {
         return false;
         }*/
        Query cancellaevento = em.createQuery("DELETE FROM Evento e WHERE e.id=" + idEvento);
        int res = cancellaevento.executeUpdate();
        if (res == 0) {
            return false;
        }
        return true;
    }

    @Override
    public boolean updateEvento(long id, String titoloEvento, String descrizioneEvento, Date dataEvento, String orari, float prezzoParterre, float prezzoArancio, float prezzoBlu, float prezzoRosso, float prezzoVerde, float prezzoGiallo) {
        Query updateEvento = em.createQuery("UPDATE Evento e SET e.titoloEvento='" + titoloEvento + "',  e.descrizioneEvento='" + descrizioneEvento + "', e.dataEvento='" + dataEvento + "', e.orari='" + orari + "', e.prezzoParterre=" + prezzoParterre + ",e.prezzoArancio=" + prezzoArancio + ", e.prezzoBlu=" + prezzoBlu + ", e.prezzoRosso=" + prezzoRosso + ", e.prezzoVerde=" + prezzoVerde + ", e.prezzoGiallo=" + prezzoGiallo + " WHERE e.id=" + id);
        int res = updateEvento.executeUpdate();
        if (res == 0) {
            return false;
        }
        return true;
    }

    @Override
    public boolean loadDataFile(String fileName, String typeFile) {
        try {
            File file = new File(fileName);
            if (!file.exists()) {
                return false;
            }

            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(file);
            doc.getDocumentElement().normalize();
            doc.getDocumentElement();
            //NodeList nList = doc.getElementsByTagName(typeFile);

            if (typeFile.equals("user")) {
                System.out.println("INIZIO LETTURA Utenti");
                NodeList nList = doc.getElementsByTagName(typeFile);
                for (int temp = 0; temp < nList.getLength(); ++temp) {
                    AnagraficaUtente utente = new AnagraficaUtente();
                    Utente credenzialiUtente = new Utente();
                    Node nNode = nList.item(temp);
                    if (nNode.getNodeType() == Node.ELEMENT_NODE) {
                        Element eElement = (Element) nNode;
                        try {
                            utente.setCodiceFiscale(eElement.getElementsByTagName("codiceFiscale").item(0).getTextContent());
                            utente.setNome(eElement.getElementsByTagName("nome").item(0).getTextContent());
                            utente.setCognome(eElement.getElementsByTagName("cognome").item(0).getTextContent());
                            char sesso;
                            if (eElement.getElementsByTagName("sesso").item(0).getTextContent().equals("M")) {
                                sesso = 'M';
                            } else {
                                sesso = 'F';
                            }
                            utente.setSesso(sesso);
                            String[] data = eElement.getElementsByTagName("dataNascita").item(0).getTextContent().split("/");
                            Date d = Date.valueOf(data[2] + "-" + data[1] + "-" + data[0]);
                            utente.setDataNascita(d);
                            utente.setLuogoNascita(eElement.getElementsByTagName("luogoNascita").item(0).getTextContent().toUpperCase());
                            String ind = eElement.getElementsByTagName("indirizzoResidenza").item(0).getTextContent();
                            utente.setIndirizzoResidenza(ind);
                            utente.setEmail(eElement.getElementsByTagName("email").item(0).getTextContent());
                            utente.setTelefono(eElement.getElementsByTagName("telefono").item(0).getTextContent());

                            credenzialiUtente.setNomeUtente(eElement.getElementsByTagName("email").item(0).getTextContent());
                            String passwordChiara = eElement.getElementsByTagName("password").item(0).getTextContent();
                            String psw = Cripta(passwordChiara);
                            //System.out.println("pwd chiara: "+ passwordChiara);
                            //System.out.println("pwd cript: "+ psw);
                            credenzialiUtente.setPassword(psw);
                            credenzialiUtente.setFlag(Integer.decode(eElement.getElementsByTagName("flag").item(0).getTextContent()));
                            if (validateRegistration(utente.getEmail())) {
                                utenteFacade.create(credenzialiUtente);
                                anagraficaUtenteFacade.create(utente);
                            }
                        } catch (Exception ex) {
                            System.out.println(ex.toString());
                            return false;
                        }
                    }
                }
                System.out.println("FINE LETTURA Utenti");
            } else if (typeFile.equals("evento")) {
                System.out.println("INIZIO LETTURA Eventi");
                NodeList nList = doc.getElementsByTagName(typeFile);
                for (int temp = 0; temp < nList.getLength(); ++temp) {
                    Node nNode = nList.item(temp);
                    if (nNode.getNodeType() == Node.ELEMENT_NODE) {
                        Element eElement = (Element) nNode;
                        String result = insertEvento(
                                eElement.getElementsByTagName("titoloEvento").item(0).getTextContent(),
                                eElement.getElementsByTagName("descrizioneEvento").item(0).getTextContent(),
                                eElement.getElementsByTagName("dataEvento").item(0).getTextContent(),
                                eElement.getElementsByTagName("orari").item(0).getTextContent(),
                                Float.valueOf(eElement.getElementsByTagName("prezzoParterre").item(0).getTextContent()),
                                Float.valueOf(eElement.getElementsByTagName("prezzoArancio").item(0).getTextContent()),
                                Float.valueOf(eElement.getElementsByTagName("prezzoBlu").item(0).getTextContent()),
                                Float.valueOf(eElement.getElementsByTagName("prezzoRosso").item(0).getTextContent()),
                                Float.valueOf(eElement.getElementsByTagName("prezzoVerde").item(0).getTextContent()),
                                Float.valueOf(eElement.getElementsByTagName("prezzoGiallo").item(0).getTextContent()),
                                eElement.getElementsByTagName("locandina").item(0).getTextContent()
                        );
                    }
                }

                System.out.println("FINE LETTURA Eventi");
            } else if (typeFile.equals("posto")) {
                NodeList nList = doc.getElementsByTagName(typeFile);
                System.out.println("INIZIO LETTURA Posti");
                for (int temp = 0; temp < nList.getLength(); ++temp) {
                    Node nNode = nList.item(temp);
                    if (nNode.getNodeType() == Node.ELEMENT_NODE) {
                        Element eElement = (Element) nNode;
                        int numero = Integer.parseInt(eElement.getElementsByTagName("numero").item(0).getTextContent());
                        String fila = eElement.getElementsByTagName("fila").item(0).getTextContent();
                        String settore = eElement.getElementsByTagName("settore").item(0).getTextContent();
                        String d = eElement.getElementsByTagName("disabili").item(0).getTextContent();
                        boolean disabili = false;
                        if (d.equals("si")) {
                            disabili = true;
                        }
                        insertPosto(numero, fila, settore, disabili);
                    }
                }
                System.out.println("FINE LETTURA Posti");

            } else if (typeFile.equals("campo")) {
                System.out.println("INIZIO LETTURA Campi");
                NodeList nList = doc.getElementsByTagName(typeFile);
                for (int temp = 0; temp < nList.getLength(); ++temp) {
                    Node nNode = nList.item(temp);
                    if (nNode.getNodeType() == Node.ELEMENT_NODE) {
                        Element eElement = (Element) nNode;
                        boolean result = insertCampo(
                                Integer.parseInt(eElement.getElementsByTagName("numeroCampo").item(0).getTextContent()),
                                Integer.parseInt(eElement.getElementsByTagName("numeroSpettatori").item(0).getTextContent()),
                                eElement.getElementsByTagName("sport").item(0).getTextContent(),
                                eElement.getElementsByTagName("tipoTerreno").item(0).getTextContent(),
                                eElement.getElementsByTagName("immagine").item(0).getTextContent(),
                                Float.valueOf(eElement.getElementsByTagName("prezzo").item(0).getTextContent())
                        );
                    }
                }

                System.out.println("FINE LETTURA Campi");
            } else if (typeFile.equals("prenotazionecampo")) {
                System.out.println("INIZIO LETTURA PrenotazioneCampi");
                NodeList nList = doc.getElementsByTagName(typeFile);
                Calendar cal = new GregorianCalendar();
                int giorno = cal.get(Calendar.DAY_OF_MONTH);
                int mese = cal.get(Calendar.MONTH) + 1;
                int anno = cal.get(Calendar.YEAR);
                String data = giorno + "-" + mese + "-" + String.valueOf(anno).substring(2);
                for (int temp = 0; temp < nList.getLength(); ++temp) {
                    Node nNode = nList.item(temp);
                    if (nNode.getNodeType() == Node.ELEMENT_NODE) {
                        Element eElement = (Element) nNode;
                        String nomeutente = eElement.getElementsByTagName("nomeutente").item(0).getTextContent();
                        String ncampo = eElement.getElementsByTagName("numerocampo").item(0).getTextContent();
                        String orario = eElement.getElementsByTagName("orarioprenotazione").item(0).getTextContent();
                        Query utente = em.createQuery("SELECT u FROM Utente u WHERE u.nomeUtente='" + nomeutente + "'");
                        Utente u = (Utente) utente.getSingleResult();
                        Query campo = em.createQuery("SELECT c FROM Campo c WHERE c.numeroCampo=" + ncampo);
                        Campo c = (Campo) campo.getSingleResult();
                        boolean result = prenotaCampo(
                                c.getId(),
                                u.getId(),
                                data,
                                orario,
                                ncampo
                        );
                    }
                }
                System.out.println("FINE LETTURA PrenotazioneCampi");
            } else {
                return false;
            }
        } catch (Exception e) {
            System.out.println(e.toString());
            return false;
        }
        return true;
    }

    @Override
    public String Cripta(String psw) {
        StringBuffer hashedpasswd = null;
        try {
            MessageDigest alg = MessageDigest.getInstance("MD5");
            alg.reset();
            alg.update(psw.getBytes());
            byte[] digest = alg.digest();
            hashedpasswd = new StringBuffer();
            String hx;
            for (int i = 0; i < digest.length; i++) {
                hx = Integer.toHexString(0xFF & digest[i]);
                //0x03 is equal to 0x3, but we need 0x03 for our md5sum
                if (hx.length() == 1) {
                    hx = "0" + hx;
                }
                hashedpasswd.append(hx);
            }
        } catch (NoSuchAlgorithmException ex) {
            System.out.println(ex.toString());
            return null;
        }
        return hashedpasswd.toString();
    }

    @Override
    public boolean validateEvent(String dataEvento, String oraEvento) {
        String[] data = dataEvento.split("/");
        Date d = Date.valueOf("20" + data[2] + "-" + data[1] + "-" + data[0]);
        Query alredyExist = em.createNamedQuery("Evento.findExist");
        alredyExist.setParameter("dataevento", d);
        alredyExist.setParameter("ora", oraEvento);
        List<String> result = alredyExist.getResultList();
        return result.isEmpty();
    }

    @Override
    public void insertPosto(int numero, String fila, String settore, boolean disabili) {
        Posto p = new Posto();
        p.setNumero(numero);
        p.setFila(fila);
        p.setSettore(settore);
        p.setDisabili(disabili);
        postoFacade.create(p);
    }

    @Override
    public void createConfigFile(String xml) {
        try {
            DocumentBuilderFactory documentFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder documentBuilder = documentFactory.newDocumentBuilder();
            Document document = documentBuilder.newDocument();

            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            DOMSource domSource = new DOMSource(document);
            StreamResult streamResult = new StreamResult(new File(xml));
            transformer.setParameter(OutputKeys.INDENT, "yes");

            Element root = document.createElement("Centrosportivo");
            document.appendChild(root);

            Element employee = document.createElement("LoadData");
            root.appendChild(employee);

            Element dataLoad = document.createElement("DataLoad");

            String timeStamp = new SimpleDateFormat("yyyy_MM_dd_HH:mm:ss").format(Calendar.getInstance().getTime());
            dataLoad.appendChild(document.createTextNode(timeStamp.toString()));

            employee.appendChild(dataLoad);
            transformer.transform(domSource, streamResult);

        } catch (ParserConfigurationException pce) {
            pce.printStackTrace();
        } catch (TransformerException tfe) {
            tfe.printStackTrace();
        }
    }

    @Override
    public int contaPostiLiberi(Long idEvento, String settore) {
        //seleziono tutte le prenotazioni relative all'event
        Query prenotazioni = em.createQuery("Select p.id From PrenotazioneEvento p WHERE p.id_evento=" + idEvento);
        List<Integer> idPrenotazioni = prenotazioni.getResultList();
        //posti totali di un settore
        Query postiTotali = em.createQuery("Select COUNT(p.id) From Posto p Where p.settore = '" + settore + "'");
        //List<Integer> postiTot = postiTotali.getResultList();
        int totPosti = Integer.parseInt(postiTotali.getSingleResult().toString());
        //cerco per tutte le prenotazioni dell'evento idEvento i posti prenotati del settore
        int postiPrenotati = 0;
        for (int i = 0; i < idPrenotazioni.size(); i++) {
            String query = "Select COUNT(po.id) From PostiOccupati po Where po.idPrenotazione = " + idPrenotazioni.get(i);
            query += " AND po.idPosto IN (Select ps.id From Posto ps Where ps.settore = '" + settore + "')";
            int temp = Integer.parseInt(em.createQuery(query).getSingleResult().toString());
            postiPrenotati += temp;
        }
        //sottraggo i posti totali al risultato della query
        System.out.println("******************** posti preno: " + postiPrenotati);
        System.out.println("******************** posti tot: " + totPosti);
        return (totPosti - postiPrenotati);
    }

    @Override
    public List<StatusPosto> getStatoPosti(long idEvento, String settore) {
        //posti del settore specificato come parametro
        Query posti = em.createNamedQuery("Posto.findBySettore");
        posti.setParameter("settore", settore);
        List<Long> idPosti = posti.getResultList();
        //seleziono tutte le prenotazioni relative all'event
        Query prenotazioni = em.createQuery("Select p.id From PrenotazioneEvento p WHERE p.id_evento=" + idEvento);
        List<Integer> idPrenotazioni = prenotazioni.getResultList();
        //cerco per tutte le prenotazioni dell'evento idEvento i posti prenotati del settore
        List<Long> idPostiPrenotati = new LinkedList<Long>();
        for (int i = 0; i < idPrenotazioni.size(); i++) {
            String query = "Select po.idPosto From PostiOccupati po Where po.idPrenotazione = " + idPrenotazioni.get(i);
            query += " AND po.idPosto IN (Select ps.id From Posto ps Where ps.settore = '" + settore + "')";
            List<Long> tempPP = em.createQuery(query).getResultList();
            for (int j = 0; j < tempPP.size(); j++) {
                idPostiPrenotati.add(tempPP.get(j));
            }
        }
        List<StatusPosto> result = new LinkedList<StatusPosto>();
        if (!idPostiPrenotati.isEmpty()) {
            for (int i = 0; i < idPosti.size(); i++) {
                if (idPostiPrenotati.contains(idPosti.get(i))) {
                    StatusPosto pp = new StatusPosto(idPosti.get(i), "prenotato");
                    result.add(pp);
                } else {
                    StatusPosto pp = new StatusPosto(idPosti.get(i), "libero");
                    result.add(pp);
                }
            }
        } else { //non ci sono posti prenotati
            for (int i = 0; i < idPosti.size(); i++) {
                StatusPosto pp = new StatusPosto(idPosti.get(i), "libero");
                result.add(pp);
            }
        }
        return result;
    }

    public List<Evento> getListEvent() {
        Query event = em.createQuery("SELECT e FROM Evento e ORDER BY e.dataEvento ASC");
        return (List<Evento>) event.getResultList();
    }

    @Override
    public boolean prenotaPosto(long idPosto, long idPreno, float costo) {
        PostiOccupati posti = new PostiOccupati();
        posti.setIdPosto(idPosto);
        posti.setIdPrenotazione(idPreno);
        posti.setCosto(costo);
        try {
            postiOccupatiFacade.create(posti);
        } catch (Exception e) {
            System.out.println(e.toString());
            return false;
        }
        return true;
    }

    @Override
    public Long trovaPosto(int numero, String fila, String settore) {
        Query posto = em.createNamedQuery("Posto.findPosto");
        posto.setParameter("settore", settore);
        posto.setParameter("fila", fila);
        posto.setParameter("numero", numero);
        List<Posto> pp = posto.getResultList();
        Long p = pp.get(0).getId();
        return p;
    }

    @Override
    public Long getIdUtente(String nomeUtente) {
        Query utente = em.createNamedQuery("Utente.findUserName");
        utente.setParameter("nomeUtente", nomeUtente);
        Utente u = (Utente) utente.getResultList().get(0);
        return u.getId();
    }

    @Override
    public Long creaPrenotazione(long idUtente, long idEvento, Date data) {
        PrenotazioneEvento prenEv = new PrenotazioneEvento();
        prenEv.setId_evento(idEvento);
        prenEv.setId_utente(idUtente);
        prenEv.setBiglietto("path://.....");
        prenEv.setDataPrenotazione(data);
        prenotazioneEventoFacade.create(prenEv);
        return prenEv.getId();
    }

    @Override
    public float getCosto(long idEvento, String settore) {
        Evento e = this.findEventbyId(idEvento);
        if (settore.equals("parterre")) {
            return e.getPrezzoParterre();
        } else if (settore.equals("arancio1") || settore.equals("arancio2")) {
            return e.getPrezzoArancio();
        } else if (settore.equals("blu1") || settore.equals("blu2")) {
            return e.getPrezzoBlu();
        } else if (settore.equals("rosso1") || settore.equals("rosso2")) {
            return e.getPrezzoRosso();
        } else if (settore.equals("verde")) {
            return e.getPrezzoVerde();
        } else {
            return e.getPrezzoGiallo();
        }
    }

    @Override
    public boolean insertCampo(int nCampo, int nSpett, String sport, String terreno, String immagine, float prezzo) {
        Campo c = new Campo();
        c.setNumeroCampo(nCampo);
        c.setNumeroSpettatori(nSpett);
        c.setSport(sport);
        c.setTipoTerreno(terreno);
        c.setImmagine(immagine);
        c.setPrezzo(prezzo);
        campoFacade.create(c);
        return true;
    }

    @Override
    public boolean modificaCampo(Long idCampo, int nCampo, int nSpett, String sport, String terreno, String immagine, float prezzo) {
        Query changepwd = em.createQuery("UPDATE Campo c SET c.numeroCampo=" + nCampo + ", c.numeroSpettatori=" + nSpett + ", c.sport='" + sport + "',  c.tipoTerreno='" + terreno + "', c.immagine='" + immagine + "', c.prezzo=" + prezzo + " WHERE c.id =" + idCampo);
        int result = changepwd.executeUpdate();
        if (result == 0) {
            return false;
        }
        return true;
    }

    @Override
    public List<Campo> getCampi() {
        Query campi = em.createNamedQuery("Campo.findAll");
        List<Campo> result = campi.getResultList();
        return result;
    }

    @Override
    public boolean insertNews(String titoloNews, String descNews, Date dataNews) {
        News n = new News();
        n.setTitoloNews(titoloNews);
        n.setDescNews(descNews);
        n.setDataNews(dataNews);
        newsFacade.create(n);
        return true;
    }

    @Override
    public java.util.List<News> readNews() {
        Query news = em.createQuery("SELECT n FROM News n ORDER BY n.dataNews DESC");
        return (List<News>) news.getResultList();
    }

    @Override
    public List<Campo> getCampiBySport(String sport) {
        Query campi = em.createQuery("SELECT c FROM Campo c WHERE c.sport ='" + sport + "' ORDER BY c.id ASC");
        List<Campo> result = campi.getResultList();
        return result;
    }

    @Override
    public List<String> getAllSportType() {
        Query campi = em.createQuery("SELECT c.sport FROM Campo c GROUP BY c.sport");
        return (List<String>) campi.getResultList();
    }

    private List<String> getTypeCampFromSport(String sport) {
        Query campi = em.createQuery("SELECT DISTINCT(c.tipoTerreno) FROM Campo c WHERE c.sport ='" + sport + "'");
        return (List<String>) campi.getResultList();
    }

    @Override
    public void updateFastSearch(String path) {
        try {
            BufferedWriter out = new BufferedWriter(new FileWriter(path));
            out.write("var disable_empty_list=true;\n\n");
            out.write("var onclickaction=\"alert\";\n\n");
            out.write("var newwindow=0\n\n");

            out.write("addListGroup(\"chainedmenu\", \"First-Select\");\n\n");

            out.write("addOption(\"First-Select\", \"Seleziona elemento\", \"\", 1);\n\n");
            List<String> sports = this.getAllSportType();
            for (String item : sports) {
                out.write("addList(\"First-Select\", \"" + item + "\", \"\", \"" + item + "\");\n");
            }
            out.write("\n");
            for (String itemSport : sports) {
                out.write("addOption(\"" + itemSport + "\", \"Seleziona elemento\", \"\", 1);\n");
                List<String> tipoCampo = getTypeCampFromSport(itemSport);
                for (String itemCampo : tipoCampo) {
                    out.write("addList(\"" + itemSport + "\", \"" + itemCampo + "\", \"\", \"" + itemSport + "-" + itemCampo + "\");\n");
                }
                out.write("\n");

                List<String> tipoCampo2 = getTypeCampFromSport(itemSport);
                for (String itemCampo : tipoCampo2) {
                    int i = 0;
                    int orario = 9;
                    while (orario < 23) {
                        if (i == 0) {
                            out.write("addOption(\"" + itemSport + "-" + itemCampo + "\", \"Seleziona elemento\", \"\", 1);\n");
                        }
                        out.write("addOption(\"" + itemSport + "-" + itemCampo + "\", \"" + orario + ":00\", \"" + itemSport + "-" + itemCampo + "-" + orario + ":00\");\n");
                        i++;
                        orario++;
                    }
                }
                out.write("\n");
            }

            out.close();
        } catch (IOException e) {
        }
    }

    @Override
    public boolean prenotaCampo(long idCampo, long idUtente, String dataPreno, String ora, String nCampo) {
        String[] data = dataPreno.split("-");
        Date d = Date.valueOf("20" + data[2] + "-" + data[1] + "-" + data[0]);
        boolean disponibilita = findPrenotazioneCampo(idCampo, d, ora);
        if (disponibilita) {
            boolean calendar = insertCampoCalendar(nCampo, d, ora);
            if (calendar) {
                PrenotazioneCampo prenotazione = new PrenotazioneCampo();
                prenotazione.setId_campo(idCampo);
                prenotazione.setId_utente(idUtente);
                prenotazione.setDataPrenotazione(d);
                prenotazione.setOrarioPrenotazione(ora);
                prenotazioneCampoFacade.create(prenotazione);
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }

    @Override
    public boolean findPrenotazioneCampo(long idCampo, Date data, String ora) {
        Query find = em.createNamedQuery("PrenotazioneCampo.findPrenotazioni");
        find.setParameter("idcampo", idCampo);
        find.setParameter("data", data);
        find.setParameter("ora", ora);
        List<PrenotazioneCampo> p = (List<PrenotazioneCampo>) find.getResultList();
        return p.isEmpty(); //true se il campo è libero, false altrimenti
    }

    private boolean insertCampoCalendar(String nCampo, Date dataPreno, String orari) {
        try {
            CalendarService myService = new CalendarService("SSCSWEB-calendar");
            myService.setUserCredentials("centrosportivosscsweb@gmail.com", "sscsweb1314");
            URL postURL = null;
            if (nCampo.equals("1")) {
                postURL = new URL("http://www.google.com/calendar/feeds/21k6080cnp4qf9feicqnc79itc@group.calendar.google.com/private/full");
            } else if (nCampo.equals("2")) {
                postURL = new URL("http://www.google.com/calendar/feeds/v6qkioirqbdput1dsk59741qkk@group.calendar.google.com/private/full");
            } else if (nCampo.equals("3")) {
                postURL = new URL("http://www.google.com/calendar/feeds/ggndm17ol0slmu8j5egpnl8qqk@group.calendar.google.com/private/full");
            } else if (nCampo.equals("4")) {
                postURL = new URL("http://www.google.com/calendar/feeds/v05c7t88g7153jlk4d8d97lgc8@group.calendar.google.com/private/full");
            } else if (nCampo.equals("5")) {
                postURL = new URL("http://www.google.com/calendar/feeds/ijs5ltsida7f00nmuq195pa5oo@group.calendar.google.com/private/full");
            } else if (nCampo.equals("6")) {
                postURL = new URL("http://www.google.com/calendar/feeds/p9oog47uchnb6dcc7cphb2d8m4@group.calendar.google.com/private/full");
            } else if (nCampo.equals("7")) {
                postURL = new URL("http://www.google.com/calendar/feeds/jubhgk9i14no9aclgil73i3eu0@group.calendar.google.com/private/full");
            } else if (nCampo.equals("8")) {
                postURL = new URL("http://www.google.com/calendar/feeds/ocuuna7okqog7f8f8e8oqe9ljg@group.calendar.google.com/private/full");
            } else if (nCampo.equals("9")) {
                postURL = new URL("http://www.google.com/calendar/feeds/3bl92msnjr4ohmlpnnhdmgophk@group.calendar.google.com/private/full");
            } else if (nCampo.equals("10")) {
                postURL = new URL("http://www.google.com/calendar/feeds/7umvpvllvcfflbvdl2kkjhfobg@group.calendar.google.com/private/full");
            }

            CalendarEventEntry myEvent = new CalendarEventEntry();
            //Set the title and description
            myEvent.setTitle(new PlainTextConstruct("Occupato"));
            System.out.println("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" + dataPreno);
            String[] ora = orari.split(":");
            int ora_fine = (Integer.decode(ora[0]) + 1) % 24;
            String[] data = dataPreno.toString().split("-");
            //Create DateTime events and create a When object to hold them, then add
            //the When event to the event

            DateTime startTime = DateTime.parseDateTime(data[0] + "-" + data[1] + "-" + data[2] + "T" + ora[0] + ":" + ora[1] + ":00+02:00");
            DateTime endTime = DateTime.parseDateTime(data[0] + "-" + data[1] + "-" + data[2] + "T" + ora_fine + ":" + ora[1] + ":00+02:00");
            When eventTimes = new When();
            eventTimes.setStartTime(startTime);
            eventTimes.setEndTime(endTime);
            myEvent.addTime(eventTimes);

            // POST the request and receive the response:
            CalendarEventEntry insertedEntry = myService.insert(postURL, myEvent);

            if (insertedEntry != null) {
                return true;
            }
        } catch (AuthenticationException ex) {
            Logger.getLogger(BusinessLogic.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        } catch (MalformedURLException ex) {
            Logger.getLogger(BusinessLogic.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        } catch (IOException ex) {
            Logger.getLogger(BusinessLogic.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        } catch (ServiceException ex) {
            Logger.getLogger(BusinessLogic.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        } catch (Exception ex) {
            Logger.getLogger(BusinessLogic.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
        return false;
    }

    @Override
    public News getNews(long id) {
        Query find = em.createNamedQuery("News.findOne");
        find.setParameter("id", id);
        return (News) find.getSingleResult();
    }

    @Override
    public List<Campo> getCampiDisponibili(String Sport, String Campo, String Orario) {
        //Query campi = em.createQuery("select c.ID from Campo c where c.SPORT = '"+Sport+"' and c.TIPOTERRENO='"+Campo+"'");
        //Query campi1 = em.createQuery("select p.ID_CAMPO from CENTROSPORTIVO.PRENOTAZIONECAMPO p where p.ID_CAMPO in (9227,9228) and p.DATAPRENOTAZIONE='2014-12-05' and p.ORARIOPRENOTAZIONE='12.30';\n" +
        //"");
        Calendar cal = new GregorianCalendar();
        int giorno = cal.get(Calendar.DAY_OF_MONTH);
        int mese = cal.get(Calendar.MONTH) + 1; //gennaio è 0
        int anno = cal.get(Calendar.YEAR);
        String data = anno + "-" + mese + "-" + giorno;
        System.out.println("DATA OGGI: " + data);
        Query campi = em.createQuery("SELECT c FROM Campo c WHERE c.sport='" + Sport + "' AND c.tipoTerreno='" + Campo + "'");
        List<Campo> campitot = campi.getResultList();
        String query = "SELECT p FROM PrenotazioneCampo p WHERE p.id_campo IN (";
        int i = 0;
        for (Campo c : campitot) {
            i++;
            query = query + c.getId();
            if (i != campitot.size()) {
                query = query + ",";
            }
        }
        query = query + ") AND p.orarioPrenotazione='" + Orario + "' AND p.dataPrenotazione='" + data + "'";
        Query campiprenotati = em.createQuery(query);
        List<PrenotazioneCampo> campip = campiprenotati.getResultList();
        List<Campo> result = new ArrayList<Campo>();
        boolean trovato;
        for (Campo campo1 : campitot) {
            trovato = false;
            for (PrenotazioneCampo campo2 : campip) {
                if (Objects.equals(campo1.getId(), campo2.getId_campo())) {
                    trovato = true;
                    break;
                }
            }
            if (!trovato) {
                result.add(campo1);
            }
        }
        return result;
    }

    @Override
    public List<PrenotazioneCampo> getPrenotazioniCampoUtente(String nomeUtente) {
        Query prenotazioni = em.createQuery("SELECT p FROM PrenotazioneCampo p, Utente u WHERE p.id_utente=u.id AND u.nomeUtente='" + nomeUtente + "'");

        return (List<PrenotazioneCampo>) prenotazioni.getResultList();
    }

    @Override
    public Campo getCampo(long id_campo) {
        Query Campo = em.createQuery("SELECT c FROM Campo c WHERE c.id='" + id_campo + "'");
        return (Campo) Campo.getSingleResult();
    }

    public Campo getCampoNum(Integer id_campo) {
        Query Campo = em.createQuery("SELECT c FROM Campo c WHERE c.numeroCampo='" + id_campo + "'");
        return (Campo) Campo.getSingleResult();
    }

    @Override
    public List<PrenotazioneEvento> getPrenotazioniEventoUtente(String nomeUtente) {
        Query prenotazioni = em.createQuery("SELECT p FROM PrenotazioneEvento p, Utente u WHERE p.id_utente=u.id AND u.nomeUtente='" + nomeUtente + "'");
        return (List<PrenotazioneEvento>) prenotazioni.getResultList();
    }

    @Override
    public Evento getEvento(long id_evento) {
        Query evento = em.createQuery("SELECT e FROM Evento e WHERE e.id=" + id_evento);
        return (Evento) evento.getSingleResult();
    }

    @Override
    public List<Posto> getPostiPrenotazione(long id_prenotazione) {
        Query posti = em.createQuery("SELECT p1 FROM PostiOccupati p,Posto p1 WHERE p.idPosto = p1.id AND p.idPrenotazione=" + id_prenotazione);
        return (List<Posto>) posti.getResultList();
    }

    @Override
    public String[] getServices(String sport) {
        String[] array = null;
        switch (sport) {
            case "calcetto": {
                array = new String[]{"docce", "pettorine", "macchinette", "calcetto-palla", "cartellini"};
                break;
            }
            case "tennis": {
                array = new String[]{"docce", "tennis-palla", "macchinette"};
                break;
            }
            case "pallavolo": {
                array = new String[]{"docce", "macchinette", "pallavolo-palla"};
                break;
            }
            case "basket": {
                array = new String[]{"docce", "basket-palla", "macchinette"};
                break;
            }
        }
        return array;
    }

    @Override
    public void sendMail(String destinatario, String soggetto, String messaggio, String img_biglietto, String img_locandina) {
        try {
            messaggio = sostituisciAccenti(messaggio);
            soggetto = sostituisciAccenti(soggetto);

            byte[] data = messaggio.getBytes("ASCII");

            String ascii = new String(data);
            MandaMail m = new MandaMail();
            m.setImgBiglietto(img_biglietto);
            m.setImgLocandina(img_locandina);
            m.setDestinatario(destinatario);
            m.setSoggetto(soggetto);
            m.setMessaggio(ascii);
            mandaMail(m);
        } catch (UnsupportedEncodingException ex) {
            Logger.getLogger(BusinessLogic.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private String sostituisciAccenti(String messaggio) {
        messaggio = messaggio.replace("à", "a'"); // per il messaggio della mail
        messaggio = messaggio.replace("è", "e'");
        messaggio = messaggio.replace("é", "e'");
        messaggio = messaggio.replace("ì", "i'");
        messaggio = messaggio.replace("ò", "o'");
        messaggio = messaggio.replace("ù", "u'");
        messaggio = messaggio.replace("’", "'");
        return messaggio;
    }

    private MandaMailResponse mandaMail(MandaMail parameters) {
        // Note that the injected javax.xml.ws.Service reference as well as port objects are not thread safe.
        // If the calling of port operations may lead to race condition some synchronization is required.
        webserviceclient.MyDispatcherPortType port = service.getMyDispatcher();
        return port.mandaMail(parameters);
    }

    @Override
    public Boolean convalidaUtente(String email, String pass) {
        Query convalida = em.createQuery("UPDATE Utente u SET u.flag=0 WHERE u.nomeUtente='" + email + "' AND u.password='" + pass + "'");
        int i = convalida.executeUpdate();
        if (i == 0) {
            return false;
        } else {
            return true;
        }
    }

    @Override
    public Boolean recuperaPsw(String email) {
        Query search = em.createQuery("SELECT u FROM Utente u WHERE u.nomeUtente='" + email + "'");
        List<Utente> u = search.getResultList();
        if (u.size() == 0) {
            return false;
        }

        //genero password casuale
        String ALPHABET = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
        Random rnd = new Random(System.currentTimeMillis());
        int LENGHT = 8;
        StringBuilder sb = new StringBuilder(LENGHT);
        for (int i = 0; i < LENGHT; i++) {
            sb.append(ALPHABET.charAt(rnd.nextInt(ALPHABET.length())));
        }

        String password = sb.toString();

        //cripto la password generata
        MessageDigest alg;
        StringBuffer hashedpasswd = new StringBuffer();
        try {
            alg = MessageDigest.getInstance("MD5");

            alg.reset();
            alg.update(password.getBytes());
            byte[] digest = alg.digest();
            String hx;
            for (int i = 0; i < digest.length; i++) {
                hx = Integer.toHexString(0xFF & digest[i]);
                //0x03 is equal to 0x3, but we need 0x03 for our md5sum
                if (hx.length() == 1) {
                    hx = "0" + hx;
                }
                hashedpasswd.append(hx);
            }
        } catch (NoSuchAlgorithmException ex) {
            Logger.getLogger(BusinessLogic.class.getName()).log(Level.SEVERE, null, ex);
        }

        Query pass = em.createQuery("UPDATE Utente u SET u.password='" + hashedpasswd.toString() + "' WHERE u.nomeUtente='" + email + "'");
        pass.executeUpdate();
        
        String messaggio = "Buongiorno " + email + ",<br>la informiamo che abbiamo ricevuto una richiesta di recupero password sul suo account, la sua nuova password è la seguente (le ricordiamo di accedere al suo account per cambiarla)<br>nuova password: " + password + "<br><br>mfn-centrosportivo";
        sendMail(email, "Recupero password", messaggio, " ", " ");
        return true;
    }

}
